Caching is an often-employed technique to improve the apparent performance of a network service, wherein a proxy to a service receives requests to a service and attempts to satisfy a request using data received from the service in fulfillment of past requests. In existing approaches, caching proxies are often employed for Web applications, where cacheable resources are identified by universal resource locators (URLs). However, these proxies are unaware of application semantics, and therefore cannot take advantage of relationships between independently addressable elements, thus limiting cache effectiveness.
By way of example, suppose there is the following sequence of requests.
1. GET/customer/(returns a collection of customer objects)
2. PUT/customer/200178578 { . . . customer data . . . }
3. GET/customer/
The semantics of the application dictate that request 2 modifies the data that is returned in request 3. If the cache is unaware of these semantics, and in the absence of explicit invalidation notification from the application, the cache will therefore either behave incorrectly (returning stale data) or will not attempt to cache this data.